import axios, { InternalAxiosRequestConfig, AxiosResponse } from 'axios'
import { useUserStoreHook } from '@/store/modules/user_store'
import { ElMessage, ElMessageBox } from 'element-plus'
console.log('import.meta.env.VITE_APP_BASE_API', import.meta.env.VITE_APP_API_PREFIX)
console.log('import.meta.env.VITE_APP_FULL_URL', import.meta.env.VITE_APP_FULL_URL)
//创建 axios实例
const service = axios.create({
    
    // baseURL: import.meta.env.VITE_APP_API_PREFIX,
    baseURL:import.meta.env.VITE_APP_FULL_URL+import.meta.env.VITE_APP_API_PREFIX,
    timeout: 200000,
    headers: { 'Content-Type': 'application/json;charset=utf-8' },
})

// 请求拦截器
service.interceptors.request.use(
    // 状态代码为【2xx】时将会触发此函数
    (config: InternalAxiosRequestConfig) => {
        const userStore = useUserStoreHook()
        if (userStore.token) {
            config.headers.Authorization = userStore.token
        }
        return config
    },
    // 状态代码超出【2xx】范围时将会触发此函数，列如：4xx、5xx、...
    (error: any) => {
        return Promise.reject(error)
    },
)

// 响应拦截器
service.interceptors.response.use(
    (response: AxiosResponse) => {
        const { code, msg } = response.data
        if (code === '00000') {
            //console.log('interceptors.response response.data = ', response.data)

            return response.data
        }
        // 响应数据为二进制流处理(Excel导出)
        if (response.data instanceof ArrayBuffer) {
            return response
        }
        ElMessage.error(msg || '系统出错')
        //todo 如果不返回，会如何
        return Promise.reject(new Error(msg || 'Error'))
    },
    (error: any) => {
        if (error.response.data) {
            const { code, msg } = error.response.data
            // token 过期,重新登录
            //todo: 修改成 await
            if (code === 'A0230') {
                ElMessageBox.confirm('当前页面已失效，请重新登录', '提示', {
                    confirmButtonText: '确定',
                    type: 'warning',
                }).then(() => {
                    const userStore = useUserStoreHook()
                    userStore.resetToken().then(() => {
                        location.reload()
                    })
                })
            } else {
                ElMessage.error(msg || '系统出错')
            }
        }
        //todo: 不返回会怎么样
        return Promise.reject(error.message)
    },
)

// 导出 axios 实例
export default service
